有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java StringTokenizer NoSuchElementExecption错误

我得到了一个NoTouchElementException,现在调试它时,我注意到Car和Carmap被正确创建,并且值被正确存储,所以我不确定ST没有看到下一个令牌?或者当is发现不再有代币时它是否停止

感谢所有人的投入

    Carmap = new HashMap<String,Car>();
    //Change file path accordingly
    File f = new File("C:\\XXX\\XXX\\XXX\\CarFaxDB.txt");
    //Check to see if file exists, else create file
    if (f.exists()){
        String data[] = readFile(f);
        for (int i =0; i<data.length; i++){

            if (data[i] != null){
                if (i>0){
                    String line = data[i];
                    StringTokenizer st = new StringTokenizer(line,",");
                    String VIN = st.nextToken();
                    String carMake = st.nextToken();
                    String carModel = st.nextToken();
                    int carYear = Integer.parseInt(st.nextToken());
                    data[i]= line;
                    Car car = new Car(VIN, carMake, carModel, carYear);
                    Carmap.put(car.getVIN(), car);
                }
            }
        }

    }

共 (2) 个答案

  1. # 1 楼答案

    出现错误是因为您试图期望一个nextToken(),但标记器没有更多的标记

    在执行^{之前,您应该检查是否有更多令牌。您可以使用hasMoreTokens()方法来完成

    此外,你应该检查你是否得到了一个非空的line,并开始打印它,看看它是否有你期望的所有标记

    以下是更正后的代码片段:

    Carmap = new HashMap<String,Car>();
    
    //Change file path accordingly
    File f = new File("C:\\Users\\XXX\\Documents\\CarFaxDB.txt");
    
    //Check to see if file exists, else create file
    if (f.exists()){
        String data[] = readFile(f);
        for (int i = 0; i < data.length; i++){
    
            if (data[i] != null){
                if (i > 0){
                    String line = data[i];
    
                    if(!StringUtils.isEmpty(line)) {
                        System.out.println(line);
                        StringTokenizer st = new StringTokenizer(line,",");
    
                        /* Check For More Tokens */
                        String VIN = st.hasMoreTokens() ? st.nextToken() : null;
                        /* Check For More Tokens */
                        String carMake = st.hasMoreTokens() ? st.nextToken() : null;
                        /* Check For More Tokens */
                        String carModel = st.hasMoreTokens() ? st.nextToken() : null;
                        /* Check For More Tokens */
                        int carYear = st.hasMoreTokens() ? Integer.parseInt(st.nextToken()) : 0;
                        data[i] = line;
    
                        Car car = new Car(VIN, carMake, carModel, carYear);
                        Carmap.put(car.getVIN(), car);
                    }
                }
            }
        }
    }
    
  2. # 2 楼答案

    在调用StringTokenizer.nextToken()之前,必须检查StringTokenizer是否有更多的令牌。你是这样做的:

    Carmap = new HashMap<String,Car>();
    //Change file path accordingly
    File f = new File("C:\\Users\\XXX\\Documents\\CarFaxDB.txt");
    //Check to see if file exists, else create file
    if (f.exists()){
        String data[] = readFile(f);
        for (int i =0; i<data.length; i++){
    
            if (data[i] != null){
                if (i>0){
                      String VIN, carMake, carModel = null;
                      int carYear = 0;
                      String line = data[i];
                      StringTokenizer st = new StringTokenizer(line,",");
                      if(st.hasMoreTokens()) {
                        VIN = st.nextToken();
                      if(st.hasMoreTokens())
                        carMake = st.nextToken();
                      if(st.hasMoreTokens())
                        carModel = st.nextToken();
                      if(st.hasMoreTokens())
                        carYear = Integer.parseInt(st.nextToken());
                      data[i]= line;
                      if(VIN != null && carMake != null && carModel != null && carYear > 0)
                      Car car = new Car(VIN, carMake, carModel, carYear);
                      Carmap.put(car.getVIN(), car);
                    }
                }
            }
        }
    
    }
    

    请看这个question的答案,它解释了更多